<?php

namespace app\api\controller;

use app\common\controller\Api;
use addons\epay\library\Service;
use Exception;
use think\Db;
use think\exception\PDOException;
use think\exception\ValidateException;
use think\Session;

/**
 * 示例接口
 */
class Demo extends Api
{

    //如果$noNeedLogin为空表示所有接口都需要登录才能请求
    //如果$noNeedRight为空表示所有接口都需要验证权限才能请求
    //如果接口已经设置无需登录,那也就无需鉴权了
    //
    // 无需登录的接口,*表示全部
    protected $noNeedLogin = ['test', 'test1','payOrder','testOrder'];
    // 无需鉴权的接口,*表示全部
    protected $noNeedRight = ['test2'];

    /**
     * 测试方法
     *
     * @ApiTitle    (测试名称)
     * @ApiSummary  (测试描述信息)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/demo/test/id/{id}/name/{name})
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="id", type="integer", required=true, description="会员ID")
     * @ApiParams   (name="name", type="string", required=true, description="用户名")
     * @ApiParams   (name="data", type="object", sample="{'user_id':'int','user_name':'string','profile':{'email':'string','age':'integer'}}", description="扩展数据")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", sample="{'user_id':'int','user_name':'string','profile':{'email':'string','age':'integer'}}", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function test()
    {
        $this->success('返回成功', $this->request->param());
    }

    /**
     * 无需登录的接口
     *
     */
    public function test1()
    {
        $this->success('返回成功', ['action' => 'test1']);
    }

    /**
     * 需要登录的接口
     *
     */
    public function test2()
    {
        $this->success('返回成功', ['action' => 'test2']);
    }

    /**
     * 需要登录且需要验证有相应组的权限
     *
     */
    public function test3()
    {
        $this->success('返回成功', ['action' => 'test3']);
    }

    /*
     * 支付订单
     */
    public function payorder(){

        try{
            $title = '支付测试';
            $user = Session::get('user');

            $amount = $this->request->request('amount');
            $type = $this->request->request('type');
            $method = $this->request->request('method');
            //订单号
            $out_trade_no = date("YmdHis") . mt_rand(100000, 999999);

            //订单标题
            $title = '测试订单';

            //回调链接
            $notifyurl = $this->request->root(true) . '/addons/epay/index/notifyx/paytype/' . $type;
            $returnurl = $this->request->root(true) . '/addons/epay/index/returnx/paytype/' . $type . '/out_trade_no/' . $out_trade_no;

            $params = [
                'amount'    => $amount,
                'orderid'   => $out_trade_no,
                'type'      => $type,
                'title'     => $title,
                'notifyurl' => $notifyurl,
                'returnurl' => $returnurl,
                'method'    => !empty($method) ? $method : 'web',
                'openid'    => $user['openid'],
            ];
            $response =  Service::submitOrder($params);
            return $response;
        }catch (ValidateException $e) {
            Db::rollback();
            $this->error($e->getMessage());
        } catch (PDOException $e) {
            Db::rollback();
            $this->error($e->getMessage());
        } catch (Exception $e) {
            Db::rollback();
            $this->error($e->getMessage());
        }

       // echo 'ppp';die;
        $this->success('返回成功', ['action' => 'test3']);
     }

     /*
      * 测试订单
      */

     public function testorder(){
         $amount = $this->request->request('amount');
         $type = $this->request->request('type');//支付类型  wechat aplipy 微信还是支付宝
         $method = $this->request->request('method');//支付方式  app  web

         if (!$amount || $amount < 0) {
             $this->error("支付金额必须大于0");
         }

         if (!$type || !in_array($type, ['alipay', 'wechat'])) {
             $this->error("支付类型不能为空");
         }

         //订单号
         $out_trade_no = date("YmdHis") . mt_rand(100000, 999999);

         //订单标题
         $title = '测试订单';

         //回调链接
         $notifyurl = $this->request->root(true) . '/addons/epay/index/notifyx/paytype/' . $type;
         $returnurl = $this->request->root(true) . '/addons/epay/index/returnx/paytype/' . $type . '/out_trade_no/' . $out_trade_no;

         $response = Service::submitOrder($amount, $out_trade_no, $type, $title, $notifyurl, $returnurl, $method);

         return $response;
     }
}
